#接口描述
#获取新闻的详细信息
from info import db
from info.models import News, User, Comment
from info.utils.commons import user_login_data
from info.utils.response_code import RET
from . import news_blue
from flask import render_template,current_app,jsonify,abort,g,session,request,json

#用户评论
@news_blue.route('/news_comment', methods=['POST'])
@user_login_data
def news_comment():
    #判断用户是否登录过
    if not g.user:
        return jsonify(errno=RET.NODATA,errmsg='用户为登录')
    #获取参数
    news_id = request.json.get('news_id')
    content = request.json.get('comment')
    parent_id = request.json.get('parent_id')

    #校验参数是否为空
    if not all([news_id,content]):
        return jsonify(errno=RET.DATAERR, errmsg='参数不全')

    #获取新闻
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='新闻获取失败')
    #判断新闻是否存在
    if not news:
        return jsonify(errno=RET.NODATA, errmsg='新闻不存在')

    #创建评论对象,设置属性
    comment = Comment()
    comment.user_id = g.user.id
    comment.news_id = news_id
    comment.content = content

    #保存到数据库
    try:
        db.session.add(comment)
        db.session.commit()
    except Exception as e:

        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='新闻获取失败')

    #提交

    return jsonify(errno=RET.OK, errmsg='评论成功',data=comment.to_dict())


@news_blue.route('/news_collect', methods=['POST'])
@user_login_data
def new_collect():
    #判断用户是否登录过
    if not g.user:
        return jsonify(errno=RET.NODATA,errmsg='用户为登录')

    #获取参数
    json_data = request.data
    dict_data = json.loads(json_data)
    news_id = dict_data.get('news_id')
    action = dict_data.get('action')
    #校验参数
    if not  all([news_id,action]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不足')

    #判断操作类型
    if not action in ['collect','cancel_collect']:
        return jsonify(errno=RET.DATAERR,errmsg='操作类型有误')

    #根据新闻编号取出新闻
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取新闻失败')

    #判断新闻对象是否存在
    if not news:
        return jsonify(errno=RET.NODATA, errmsg='新闻不存在')

    #根据请求类型进行  收藏或取消
    try:

        if action == 'collect':
            #判断是否收藏过该新闻
            if news not in g.user.collection_news:
                g.user.collection_news.append(news)
        else:
            if news  in g.user.collection_news:
                g.user.collection_news.remove(news)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='添加收藏失败')
    #返回相应
    return jsonify(errno=RET.OK,errmsg='收藏成功')



#获取新闻详情
@news_blue.route('/<int:news_id>')
@user_login_data
def news_detail(news_id):
    #进入网页是判断用户是否登陆


    #获取新闻编号
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='新闻获取失败')
    #判断新闻是否存在
    if not news:
        abort(404)

    #热门排行
    try:
        news_list_click = News.query.order_by(News.clicks.desc()).limit(7).all()
    except Exception as e:
        current_app.logger.error(e)

    #转字典
    click_news_list = []
    for newsd in news_list_click:
        click_news_list.append(newsd.to_dict())

    #查看新闻是否被用户收藏过
    is_collected = False

    if g.user:
        if news in g.user.collection_news:
            is_collected  = True

    #显示评论
    try:
        comments = Comment.query.filter(news_id == Comment.news_id).order_by(Comment.create_time.desc()).all()
    except Exception as e:
        current_app.logger.error(e)
        return  jsonify(errno=RET.NODATA,errmsg='无法获取评论')

    #获取用户所有点过赞的评论编号
    comment_likes = g.user.comment_likes

    comment_ids = []
    for comment_like in comment_likes:
        comment_ids.append(comment_like.comment_id)

    #转换为字典
    comments_list = []
    for comment in comments:

        com_dict = comment.to_dict()
        com_dict['is_like'] = False
        #在转换成列表时判断当前用户是否点过赞
        if g.user :
            if comment.id in comment_ids:
                com_dict['is_like'] = True

        comments_list.append(com_dict)






    #携带渲染页面
    data = {
        'news':news.to_dict(),
        'click_news_list':click_news_list,
        # 判断下用户是否存在
        'user_info': g.user.to_dict() if g.user else "",
        # 判断用户是否收场新闻
        'is_collected':is_collected,
        'comments':comments_list
    }

    return render_template('news/detail.html',data=data)